home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ccdl151s.zip / INCLUDE / C.H next >
C/C++ Source or Header  |  1997-06-20  |  8KB  |  249 lines

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1996, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and sources are distributed along with any executables derived from them.
  11.  *
  12.  * The author is not responsible for damages, either direct or consequential,
  13.  * that may arise from use of this software.
  14.  *
  15.  * v1.5 August 1996
  16.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  17.  *
  18.  * Credits to Mathew Brandt for original K&R C compiler
  19.  *
  20.  */
  21.  
  22. /*      compiler header file    */
  23.  
  24. #define TRUE 1
  25. #define FALSE 0
  26.  
  27.  
  28. /* declaration flags */
  29. #define DF_INT 1
  30. #define DF_ABS 2
  31. #define DF_CONST 4
  32. #define DF_VOL 8
  33. #define DF_FUNCPARMS 16
  34. #define DF_GLOBAL 32
  35. #define DF_AUTOREG 64
  36.  
  37. #define UF_DEFINED 1
  38. #define UF_USED    2
  39. #define UF_ASSIGNED 4
  40. #define UF_CANASSIGN 8
  41.  
  42. #define GF_ASSIGN 1
  43. #define GF_CONTINUABLE 2
  44. #define GF_CONTINUE 4
  45. #define GF_GOTO 8
  46. #define GF_DEF 16
  47. #define GF_BREAK 32
  48. #define GF_RETURN 64
  49. #define GF_UNREACH 128
  50. #define GF_NOPROTO 256
  51. #define GF_AND 512
  52. #define GF_SUPERAND 1024
  53. #define GF_INLOOP 2048
  54. #define GF_INFUNCPARMS 4096
  55.  
  56. #define PF_PRIVATE 0
  57. #define PF_PROTECTED 1
  58. #define PF_PUBLIC 2
  59. #define PF_VIRTUAL 4
  60. #define PF_PURE 8
  61. #define PF_INLINE 16
  62. #define PF_STATIC 32
  63. #define PF_CLASSDEF 64
  64. #define PF_CLASSFUNC 128
  65. #define PF_CLASSHEAD 256
  66.  
  67. /* keywords and symbols */
  68. enum e_sym {
  69.         id, cconst, iconst, lconst, iuconst, luconst, sconst, lsconst,
  70.     fconst, lrconst, rconst, plus, minus,
  71.         star, divide, lshift, rshift, modop, eq, neq, lt, leq, gt,
  72.         geq, assign, asplus, asminus, astimes, asdivide, asmodop,
  73.         aslshift, asrshift, asand, asor, asxor, autoinc, autodec, hook, compl,
  74.         comma, colon, semicolon, uparrow, openbr, closebr, begin, end,
  75.         openpa, closepa, pointsto, dot, lor, land, not, or, and, ellipse, 
  76.     classsel, pointstar, dotstar, kw_int,
  77.         kw_void, kw_char, kw_float, kw_double, kw_struct, kw_union,
  78.         kw_long, kw_short, kw_unsigned, kw_signed, kw_auto, kw_extern,
  79.         kw_register, kw_typedef, kw_static, kw_goto, kw_return,
  80.         kw_sizeof, kw_break, kw_continue, kw_if, kw_else, kw_for,
  81.         kw_do, kw_while, kw_switch, kw_case, kw_default, kw_enum, kw_volatile,
  82.     kw_const, kw_phitext, kw__trap, kw__interrupt, kw__abs, kw__genword,
  83.     kw_public, kw_private, kw_protected, kw_class, kw_friend, kw_new,
  84.     kw_delete, kw_this, kw_operator, kw_inline,
  85.     kw_try,kw_throw,kw_catch, kw_template, kw__pascal, kw_asm,
  86.     kw_asmreg,kw_asminst,
  87.     /* These next are generic register names */    
  88.     kw_D0,kw_D1,kw_D2,kw_D3,kw_D4,kw_D5,kw_D6,kw_D7,
  89.     kw_D8,kw_D9,kw_DA,kw_DB,kw_DC,kw_DD,kw_DE,kw_DF,
  90.     kw_A0,kw_A1,kw_A2,kw_A3,kw_A4,kw_A5,kw_A6,kw_A7,
  91.     kw_A8,kw_A9,kw_AA,kw_AB,kw_AC,kw_AD,kw_AE,kw_AF,
  92.     kw_F0,kw_F1,kw_F2,kw_F3,kw_F4,kw_F5,kw_F6,kw_F7,
  93.     kw_F8,kw_F9,kw_FA,kw_FB,kw_FC,kw_FD,kw_FE,kw_FF,
  94.     eol, eof };
  95.  
  96. /* storage classes */
  97. enum e_sc {
  98.         sc_static, sc_auto, sc_global, sc_external, sc_type, sc_defunc, sc_const,
  99.         sc_member, sc_label, sc_ulabel, sc_argument, sc_memberreg, sc_autoreg,
  100.     sc_externalfunc,sc_abs };
  101.  
  102. /* basic types */
  103. enum e_bt {
  104.     /* This first two lines MUST be ordered for the 
  105.      * lostconv stuff to work
  106.      */
  107.         bt_char, bt_unsignedchar, bt_enum,bt_short, bt_unsignedshort, 
  108.     bt_long, bt_unsigned, bt_float, bt_double, bt_longdouble, bt_untyped,
  109.     bt_pointer,bt_ref,bt_void,bt_struct, bt_union, bt_func, bt_class, bt_iclass,
  110.     bt_ifunc, bt_ptrfunc,bt_matchall, bt_ellipse, bt_bitfield };
  111.  
  112. struct slit {
  113.         struct slit     *next;
  114.         int             label;        /* label to use */
  115.         char            *str;        /* string to dump */
  116.     char        type;        /* ascii/phitext or wide */
  117.         };
  118.  
  119. /* symbols */
  120. struct sym {
  121.         struct sym      *next;            /* next symbol (local tabs only) */
  122.         char            *name;            /* symbol name */
  123.         enum e_sc    storage_class;        /* storage class */
  124.     int        extflag:1;        /* if external, was it used */
  125.     int        absflag:1;        /* the _abs keyword was used */
  126.     int        intflag:1;        /* the _interrupt keyword was used */
  127.     int        indecltable:1;        /* global already in dump table */
  128.     int        pascaldefn:1;        /* function: pascal type */
  129.     int        inreg:1;          /* function var is in reg, no stack space needed */
  130.     int        funcparm:1;        /* function var is a param and has space allocated */
  131.     int         staticlabel:1;    /* Var is a static declared in a function */
  132. /*    char        pflags;       
  133.     struct sym     *parent;      */          /* Parent class */
  134.     int        linkid;            /* ID to use for linkage purposes (binary output) */
  135.     ENODE *        defalt;            /* Default for function params */
  136.                         /* Also name for CPP overload lists */
  137.     /* these fields depend on storage_class */
  138.         union   {
  139.                 long            i;        /* int val */
  140.                 unsigned long   u;        /* nsigned val */
  141.                 double          f;        /* float val */
  142.         struct stab {    
  143.             struct sym *head, *tail; /* Overload table*/
  144.             } overlist;
  145.                 char            *s;        /* string val */
  146.                 }
  147.                         value;
  148.     /* Type declarations */
  149.         struct typ {
  150.                 enum e_bt               type;    /* the type */
  151.                 char            val_flag;       /* set if is an array */
  152.                char        uflags;            /* Track usage */
  153.         char        cflags;        /* const & vol flags */
  154.         char         classflags;    /* Public, protected, private */
  155.         char        bits;        /* -1 for not a bit val, else bit field len */
  156.         char        startbit;    /* start of bit field */    
  157.                 long            size;        /* total size of type */
  158.         /* local symbol tables */
  159.         struct stab lst;         /* Symbol table for structs & functions */
  160.                 struct typ      *btp;        /* pointer to next type (pointers & arrays */
  161.                 char            *sname;        /* structure name ? */
  162.         struct sym *tdef;        /* Pointer to a typedef entry */
  163.                 }
  164.                         *tp;
  165.     struct decldata {
  166.             struct decldata *link;
  167.             enum { dd_byte,dd_word,dd_long,dd_float,dd_double,
  168.                    dd_ldouble, dd_pcname, dd_dataname, dd_storage,
  169.                    dd_label
  170.                  } mode;
  171.             union {
  172.                 long i;
  173.                 double f;
  174.                 struct sym *sp;
  175.             } val;        
  176.             long offset;
  177.     } *init;
  178. };
  179.  
  180. #define SYM     struct sym
  181. #define TYP     struct typ
  182. #define TABLE   struct stab
  183.  
  184. #define MAX_STRLEN      120
  185. #define MAX_STLP1       121
  186.  
  187. /* struct for preprocessor if tracking */
  188. typedef struct ifstruct {
  189.         struct ifstruct *link;        /* link */
  190.         short iflevel;            
  191.         short elsetaken;
  192. } IFSTRUCT;
  193.         
  194. /* #define tracking */
  195. typedef struct {
  196.         char *string;
  197.         short argcount;
  198.         char **args;
  199. } DEFSTRUCT;
  200.  
  201. /* error list */
  202. struct errl {
  203.         struct errl *link;
  204.         short errornumber;
  205.         void *data;
  206. };
  207.  
  208. /* used for error skimming */
  209. #define BALANCE struct balance
  210. #define BAL_PAREN   0
  211. #define BAL_BRACKET 0
  212. #define ERRORS struct errl
  213.  
  214. struct balance {
  215.         struct balance *back;
  216.         short type;
  217.         short count;
  218. };
  219.  
  220. /* Global symbol table is a hash table */
  221. #define HASHTABLESIZE 1023
  222.  
  223. typedef struct _hashrec_ {
  224.    struct _hashrec_ *link;    /* Link to next element in list */
  225.    char *key;    /* Full key */
  226. } HASHREC;
  227.  
  228. typedef struct {
  229.     char *word;
  230.     short atype;
  231.     short amode;
  232. } ASMNAME;
  233.  
  234. typedef struct kwblk {
  235.                 struct kwblk *next;
  236.         char            *word;
  237.         short        stype;
  238.     enum { KW_CPLUSPLUS=1,KW_INLINEASM=2 } flags;
  239.     ASMNAME        *data;
  240.         } KEYWORDS;
  241.  
  242. typedef struct {
  243.     char *word;
  244.     char regtype;
  245.     char regnum;
  246.     char size;
  247. } ASMREG;
  248.  
  249. #include "cc.p"